<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Putting Records Using Cursors</title>
    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
    <link rel="start" href="index.html" title="Getting Started with Berkeley DB" />
    <link rel="up" href="Cursors.html" title="Chapter 4. Using Cursors" />
    <link rel="prev" href="Positioning.html" title="Getting Records Using the Cursor" />
    <link rel="next" href="DeleteEntryWCursor.html" title="Deleting Records Using Cursors" />
  </head>
  <body>
    <div xmlns="" class="navheader">
      <div class="libver">
        <p>Library Version 11.2.5.3</p>
      </div>
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Putting Records Using Cursors</th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="Positioning.html">Prev</a> </td>
          <th width="60%" align="center">Chapter 4. Using Cursors</th>
          <td width="20%" align="right"> <a accesskey="n" href="DeleteEntryWCursor.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="PutEntryWCursor"></a>Putting Records Using Cursors</h2>
          </div>
        </div>
      </div>
      <p>
        You can use cursors to put records into the database. DB's behavior
        when putting records into the database differs depending on the flags
        that you use when writing the record, on the access method that you are
        using, and on whether your database supports sorted duplicates.
    </p>
      <p>
        Note that when putting records to the database using a cursor, the
        cursor is positioned at the record you inserted. 
    </p>
      <p>
        You use 
            
            <code class="methodname">Dbc::put()</code>
            
        to put (write) records to the database. You can use the following flags
        with this method:
    </p>
      <div class="itemizedlist">
        <ul type="disc">
          <li>
            <p>
            
            <code class="literal">DB_NODUPDATA</code>
         </p>
            <p>
            If the provided key  already exists 
            in the database, then this method returns 
            <code class="literal">DB_KEYEXIST</code>.
        </p>
            <p>
            If the key does not exist, then the order that the record is put into the database 
            is determined by the 
                
                <span>
                    insertion order in use by the database. If a comparison
                    function has been provided to the database, the record is
                    inserted in its sorted location. Otherwise (assuming BTree), 
                    lexicographical sorting is used, with
                    shorter items collating before longer items.
                </span>
         </p>
            <p>
            This flag can only be used for the BTree and Hash access methods,
            and only if the database has been configured to support sorted
            duplicate data items (<code class="literal">DB_DUPSORT</code> was specified at
            database creation time).
        </p>
            <p>
            This flag cannot be used with the Queue or Recno access methods.
        </p>
            <p>
            For more information on duplicate records, see
            <a class="xref" href="btree.html#duplicateRecords" title="Allowing Duplicate Records">Allowing Duplicate Records</a>.
        </p>
          </li>
          <li>
            <p>
            
            <code class="literal">DB_KEYFIRST</code>
        </p>
            <p>
            For databases that do not support duplicates, this method behaves
                
                <span>
                    exactly the same as if a default insertion was performed.
                </span>
                If the database supports duplicate records, 
                    
                    <span>
                        and a duplicate sort function has been specified, the
                        inserted data item is added in its sorted location. If
                        the key already exists in the database and no duplicate
                        sort function has been specified, the inserted data item
                        is added as the first of the data items for that key.
                    </span>
        </p>
          </li>
          <li>
            <p>
            
            <code class="literal">DB_KEYLAST</code>
        </p>
            <p>
            Behaves exactly as if 
                <code class="literal">DB_KEYFIRST</code> 
                
            was used, except that if the key already exists in the database and no
            duplicate sort function has been specified, the
            inserted data item is added as the last of the data
            items for that key.
        </p>
          </li>
        </ul>
      </div>
      <p>For example:</p>
      <a id="cxx_cursor7"></a>
      <pre class="programlisting">#include &lt;db_cxx.h&gt;
#include &lt;string.h&gt;

...

char *key1str = "My first string";
char *data1str = "My first data";
char *key2str = "A second string";
char *data2str = "My second data";
char *data3str = "My third data";


Db my_database(NULL, 0);
Dbc *cursorp;

try {
    // Set up our DBTs
    Dbt key1(key1str, strlen(key1str) + 1);
    Dbt data1(data1str, strlen(data1str) + 1);

    Dbt key2(key2str, strlen(key2str) + 1);
    Dbt data2(data2str, strlen(data2str) + 1);
    Dbt data3(data3str, strlen(data3str) + 1);

    // Database open omitted

    // Get the cursor
    my_database.cursor(NULL, &amp;cursorp, 0);

    // Assuming an empty database, this first put places
    // "My first string"/"My first data" in the first 
    // position in the database
    int ret = cursorp-&gt;put(&amp;key1, &amp;data1, DB_KEYFIRST); 

    // This put places "A second string"/"My second data" in the
    // the database according to its key sorts against the key 
    // used for the currently existing database record. Most likely
    // this record would appear first in the database.
    ret = cursorp-&gt;put(&amp;key2, &amp;data2, 
            DB_KEYFIRST); /* Added according to sort order */

    // If duplicates are not allowed, the currently existing record that 
    // uses "key2" is overwritten with the data provided on this put.
    // That is, the record "A second string"/"My second data" becomes
    // "A second string"/"My third data"
    // 
    // If duplicates are allowed, then "My third data" is placed in the
    // duplicates list according to how it sorts against "My second data".
    ret = cursorp-&gt;put(&amp;key2, &amp;data3, 
            DB_KEYFIRST); // If duplicates are not allowed, record 
                          // is overwritten with new data. Otherwise, 
                          // the record is added to the beginning of 
                          // the duplicates list.
} catch(DbException &amp;e) {
        my_database.err(e.get_errno(), "Error!");
} catch(std::exception &amp;e) {
        my_database.errx("Error! %s", e.what());
}

// Cursors must be closed
if (cursorp != NULL) 
    cursorp-&gt;close(); 

my_database.close(0);</pre>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="Positioning.html">Prev</a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="Cursors.html">Up</a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="DeleteEntryWCursor.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">Getting Records Using the Cursor </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top"> Deleting Records Using Cursors</td>
        </tr>
      </table>
    </div>
  </body>
</html>
